Current File : /home/jeconsul/public_html/wp-content/plugins/suremails/inc/api/email-stats.php
<?php
/**
 * EmailStats class
 *
 * Handles the REST API endpoint to get email statistics.
 *
 * @package SureMails\Inc\API
 */

namespace SureMails\Inc\API;

use SureMails\Inc\DB\EmailLog;
use SureMails\Inc\Traits\Instance;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Class EmailStats
 *
 * Handles the `/email-stats` REST API endpoint.
 */
class EmailStats extends Api_Base {
	use Instance;

	/**
	 * Route base.
	 *
	 * @var string
	 */
	protected $rest_base = '/email-stats';

	/**
	 * Register API routes.
	 *
	 * @since 0.0.1
	 * @return void
	 */
	public function register_routes() {
		register_rest_route(
			$this->get_api_namespace(),
			$this->rest_base,
			[
				[
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => [ $this, 'get_email_stats' ],
					'permission_callback' => [ $this, 'validate_permission' ],
					'args'                => [
						'start_date' => [
							'required'          => true,
							'validate_callback' => static function ( $param ) {
								return strtotime( $param ) !== false;
							},
							'sanitize_callback' => 'sanitize_text_field',
						],
						'end_date'   => [
							'required'          => false,
							'validate_callback' => static function ( $param ) {
								return strtotime( $param ) !== false;
							},
							'sanitize_callback' => 'sanitize_text_field',
						],
					],
				],
			]
		);
	}

	/**
	 * Retrieves email statistics (total sent and failed emails) for a given date range.
	 *
	 * @param WP_REST_Request<array<string, mixed>> $request The REST request object containing the selected dates.
	 * @return WP_REST_Response The REST response object with email statistics or an error message.
	 */
	public function get_email_stats( $request ) {
		$email_log = EmailLog::instance();

		// Get the date range from the request body.
		$start_date = $request->get_param( 'start_date' );
		$end_date   = $request->get_param( 'end_date' );

		$start_datetime = $start_date ? new \DateTime( $start_date ) : null;
		$end_datetime   = $end_date ? new \DateTime( $end_date ) : null;

		if ( $start_datetime && $end_datetime ) {
			$end_datetime->setTime( 23, 59, 59 );
		}

		if ( $start_datetime && ! $end_datetime ) {
			$end_datetime = clone $start_datetime;
			$end_datetime->setTime( 23, 59, 59 );
		}

		if ( ! $start_datetime ) {
			return new WP_REST_Response(
				[
					'success' => false,
					'message' => __( 'The start_date parameter is required.', 'suremails' ),
				],
				400
			);
		}

		$date_from_query = $start_datetime->format( 'Y-m-d H:i:s' );
		$date_to_query   = $end_datetime ? $end_datetime->format( 'Y-m-d H:i:s' ) : $start_datetime->format( 'Y-m-d H:i:s' );

		// 1. Fetch chart data for emails sent and failed within the date range
		$chart_data = $email_log->get(
			[
				'select'   => "
					DATE(created_at) as created_at,
					SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) as total_sent,
					SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as total_failed
				",
				'where'    => [
					'created_at >=' => $date_from_query,
					'created_at <=' => $date_to_query,
				],
				'group_by' => 'DATE(created_at)',
				'order'    => [ 'created_at' => 'ASC' ],
			]
		);

		// 2. Fetch total sent and failed emails for the date range
		$total_counts = $email_log->get(
			[
				'select' => "
					SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) as total_sent,
					SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as total_failed
				",
				'where'  => [
					'created_at >=' => $date_from_query,
					'created_at <=' => $date_to_query,
				],
			]
		);

		$total_sent   = $total_counts[0]['total_sent'] ?? 0;
		$total_failed = $total_counts[0]['total_failed'] ?? 0;

		// Prepare the response.
		return rest_ensure_response(
			[
				'success' => true,
				'data'    => [
					'total_sent'   => (int) $total_sent,
					'total_failed' => (int) $total_failed,
					'chart_data'   => $chart_data, // Include chart data.
					'from'         => $date_from_query,
					'end_at'       => $date_to_query,
				],
			]
		);
	}
}

// Initialize the EmailStats singleton.
EmailStats::instance();